class_name 玩家 extends CharacterBody2D

var 速度:float = 150.0
var 方向向量:Vector2 = Vector2.DOWN
var 最后输入的方向向量:Vector2 = Vector2.ZERO

@export var 玩家状态:状态
@onready var animation_tree: AnimationTree = $AnimationTree
@onready var 动画树状态对象 = animation_tree.get("parameters/StateMachine/playback") as AnimationNodeStateMachinePlayback
@onready var 攻击动画树状态对象 = animation_tree.get("parameters/StateMachine/攻击状态/playback") as AnimationNodeStateMachinePlayback
@onready var 技能攻击动画树状态对象 = animation_tree.get("parameters/StateMachine/攻击状态/技能攻击/playback") as AnimationNodeStateMachinePlayback
@onready var 受击框对象: 受击框 = $受击框
@onready var 伤害框对象: 伤害框 = $普通攻击纹理/伤害框
@onready var 特效动画: AnimationPlayer = $特效动画
@onready var 音乐播放器: AudioStreamPlayer = $Audio/AudioListener2D
const 普通攻击音效 = preload("uid://ba8v2vg65hs8h")
var 敌方伤害框对象:伤害框

func _ready() -> void:
	# 全局事件.暂停()
	受击框对象.hurt.connect(hit.call_deferred)
	玩家状态 = 玩家状态.duplicate(true)
	伤害框对象.击退量 = 200
	玩家状态.死亡信号.connect(死亡)
	玩家状态.生命值修改(玩家状态.生命值,玩家状态.最大生命值,self)

func _physics_process(delta: float) -> void:
	var 当前动画状态 = 动画树状态对象.get_current_node()
	match 当前动画状态:
		'待机与移动':
			move_or_stop()
		'攻击状态':
			pass
		'被击状态':
			if is_instance_valid(敌方伤害框对象):
				velocity = velocity.move_toward(Vector2.ZERO,敌方伤害框对象.击退量 * delta)
				move_and_slide()
			
func 死亡() -> void:
	queue_free()
	remove_from_group("玩家角色")
	process_mode = Node.PROCESS_MODE_DISABLED
	# 获取当前节点的父节点
	var parent_node = get_parent()
	var 玩家重生信标 = parent_node.get_node("玩家重生信标")
	if 玩家重生信标:
		玩家重生信标.玩家重生()
	else:
		玩家管理器.添加玩家(get_parent())
	
# 被攻击
func hit(伤害框对象:伤害框) -> void:
	敌方伤害框对象 = 伤害框对象
	velocity = 伤害框对象.伤害方向 * 伤害框对象.击退量
	玩家状态.生命值修改(玩家状态.生命值 - 伤害框对象.伤害值,玩家状态.最大生命值,self) 
	特效动画.play("受击")
	动画树状态对象.travel('被击状态')
	pass
	
# 移动/待机
func move_or_stop() -> void:
	方向向量 = Input.get_vector("移动_左","移动_右","移动_上","移动_下")	
	if 方向向量 != Vector2.ZERO:
		最后输入的方向向量 = 方向向量
		伤害框对象.伤害方向 = 方向向量
		undate_blend_positions(Vector2(方向向量.x, -方向向量.y))
	if Input.is_action_just_pressed('普通攻击'):
		动画树状态对象.travel('攻击状态')		
		攻击动画树状态对象.travel('普通攻击')
		音乐播放器.stream = 普通攻击音效
		音乐播放器.pitch_scale = randf_range(0.9,1.1)
		音乐播放器.play()
	if Input.is_action_just_pressed('技能栏1'):
		skill_switching('技能栏1')
	
	velocity = 方向向量 * 速度
	move_and_slide()
	
# 技能攻击
func skill_switching(_skill_name) -> void:
	动画树状态对象.travel('攻击状态')		
	攻击动画树状态对象.travel('技能攻击')
	技能攻击动画树状态对象.travel('技能攻击_1')

# 设置动画树目标点
func undate_blend_positions(direction_vector) -> void:
	animation_tree.set("parameters/StateMachine/待机与移动/待机/blend_position", direction_vector)
	animation_tree.set("parameters/StateMachine/待机与移动/移动/blend_position", direction_vector)
	animation_tree.set("parameters/StateMachine/攻击状态/普通攻击/blend_position", direction_vector)
	animation_tree.set("parameters/StateMachine/被击状态/blend_position",direction_vector)
